<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>once的设计</title>
</head>
<body>
    <script>
        /**
         * once 设计思路
         * 1. add 方法不变
         * 2. fire 方法
         *    2.1 先判断list是否存在
         *    2.2 list存在，循环list，执行每个task
         *    2.3 执行完成后，判断 options === 'once', 是：清空list
        */
        var Callback = function(options) {
            var self,
                list = [];
            self = {
                add: function(fn) {
                    list.push(fn)
                },
                fire: function(data) {
                    // 判断list 是否存在
                    if(list) {
                        // 执行
                        list.forEach(function(task) {
                            task(data)
                        })
                        // 清空list
                        if(options === 'once') {
                            list = undefined
                        }
                    }
                }
            }
            return self
        }
    
        function test1(data) {
            document.write('test1~~~~',data)
        }
        function test2(data) {
            document.write('test2~~~~',data)
        }

        var cbs = Callback('once')
        cbs.add(test1)
        cbs.add(test2)
        cbs.fire('hahaha') // test1~~~~hahahatest2~~~~hahaha
        cbs.fire('kakak')  // undefined
    </script>
</body>
</html>